#!/bin/bash
stty sane
stty erase ^H

# 配置文件路径
CONFIG_DIR="/etc/auth_system"
CONFIG_FILE="$CONFIG_DIR/dockeruser_config.txt"

# Check if running as root
if [ "$(id -u)" -ne 0 ]; then
    echo "错误：此脚本必须以 root 权限运行！"
    echo "请使用 'sudo -i' 切换到 root 用户后重试。"
    exit 1
fi

# 初始化环境
init_env() {
    # 创建配置目录（如果不存在）
    mkdir -p "$CONFIG_DIR"
    
    # 恢复终端设置
    stty sane
    stty erase ^H 2>/dev/null
    
    # 颜色定义
    export RED='\033[0;31m'
    export GREEN='\033[0;32m'
    export YELLOW='\033[0;33m'
    export NC='\033[0m'
}

# 检查root权限
check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "${RED}错误：此脚本必须以 root 权限运行！${NC}"
        echo -e "请使用 ${YELLOW}'sudo -i'${NC} 切换到 root 用户后重试。"
        exit 1
    fi
}

# 加载用户数据
load_users() {
    local user_data_url="https://gitee.com/banban1000/docker/raw/master/dsm/user.txt"
    local temp_file=$(mktemp)
    
    # 静默下载用户数据
    if ! curl --connect-timeout 15 --retry 2 -fsSL "$user_data_url" > "$temp_file"; then
        echo -e "${RED}错误：用户数据下载失败！${NC}"
        rm -f "$temp_file"
        exit 1
    fi

    # 清空原有用户数据
    unset users
    declare -gA users

    # 解析用户数据
    while IFS= read -r line; do
        # 移除注释和空格
        line=$(echo "$line" | sed -e 's/#.*$//' -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
        
        if [[ "$line" =~ ^\[([^]]+)\]=\"([^\|]+)\|([^\|]+)\|([0-9]+) ]]; then
            local username=$(echo "${BASH_REMATCH[1]}" | tr -d '"'"'")
            local password_hash="${BASH_REMATCH[2]}"
            local create_date="${BASH_REMATCH[3]}"
            local valid_months="${BASH_REMATCH[4]}"
            
            users["$username"]="$password_hash|$create_date|$valid_months"
        fi
    done < "$temp_file"

    rm -f "$temp_file"
}

# 检查密码是否过期
check_password_expiry() {
    local username=$1
    local user_info=${users[$username]}
    
    # 分割用户信息
    IFS='|' read -ra parts <<< "$user_info"
    local hashed_password=${parts[0]}
    local create_date=${parts[1]}
    local valid_months=${parts[2]}
    
    # 如果有效月数为0，则密码长期有效
    if [[ $valid_months -eq 0 ]]; then
        return 0
    fi
    
    # 计算过期日期
    local expire_date=$(date -d "$create_date + $valid_months months" +%Y-%m-%d)
    local today=$(date +%Y-%m-%d)
    
    # 比较日期
    if [[ $today > $expire_date ]]; then
        echo -e "${RED}密码已过期！请更换密码。${NC}"
        return 1
    else
        echo -e "密码有效期至: ${GREEN}$expire_date${NC}"
        return 0
    fi
}

# 检测是否已配置用户和密码
check_config() {
    if [[ -f "$CONFIG_FILE" ]]; then
        local saved_username=$(awk -F= '/username/{print $2}' "$CONFIG_FILE")
        local saved_password_hash=$(awk -F= '/password_hash/{print $2}' "$CONFIG_FILE")
        local saved_create_date=$(awk -F= '/create_date/{print $2}' "$CONFIG_FILE")
        local saved_valid_months=$(awk -F= '/valid_months/{print $2}' "$CONFIG_FILE")

        if [[ -n "$saved_username" && -n "$saved_password_hash" ]]; then
            # 检查用户是否存在
            if [[ -n "${users[$saved_username]}" ]]; then
                # 获取存储的用户信息
                local user_info=${users[$saved_username]}
                IFS='|' read -ra parts <<< "$user_info"
                local stored_hash=${parts[0]}
                
                # 验证密码哈希
                if [[ "$stored_hash" == "$saved_password_hash" ]]; then
                    # 检查密码有效期
                    if check_password_expiry "$saved_username"; then
                        echo -e "${GREEN}检测到已配置用户：$saved_username，跳过登录验证。${NC}"
                        return 0
                    else
                        echo -e "${RED}密码已过期，需要重新登录。${NC}"
                        return 1
                    fi
                else
                    echo -e "${RED}配置文件中密码不匹配，需要重新登录。${NC}"
                    return 1
                fi
            else
                echo -e "${RED}配置文件中用户不存在，需要重新登录。${NC}"
                return 1
            fi
        else
            echo -e "${RED}配置文件不完整，需要登录。${NC}"
            return 1
        fi
    else
        echo -e "${YELLOW}未检测到配置文件，需要登录。${NC}"
        return 1
    fi
}

# 用户登录
user_login() {
    local username password hashed_password
    read -p "请输入用户名: " username
    read -sp "请输入密码: " password
    echo

    # 标准化输入用户名
    username=$(echo "$username" | tr -d '"'"'")

    if [[ -z "${users[$username]}" ]]; then
        echo -e "${RED}错误：用户名 '$username' 不存在！${NC}"
        echo -e "可用用户列表:"
        printf -- '- %s\n' "${!users[@]}"
        return 1
    fi
    
    hashed_password=$(echo -n "$password" | sha256sum | awk '{print $1}')
    if [[ "${users[$username]%%|*}" == "$hashed_password" ]]; then
        if check_password_expiry "$username"; then
            echo -e "${GREEN}登录成功！${NC}"
            update_config "$username" "$hashed_password"
            return 0
        fi
    else
        echo -e "${RED}密码错误！${NC}"
        return 1
    fi
}

# 更新配置文件
update_config() {
    local username="$1"
    local hashed_password="$2"
    local user_info=${users[$username]}
    
    IFS='|' read -ra parts <<< "$user_info"
    local create_date=${parts[1]}
    local valid_months=${parts[2]}
    
    echo "username=$username" > "$CONFIG_FILE"
    echo "password_hash=$hashed_password" >> "$CONFIG_FILE"
    echo "create_date=$create_date" >> "$CONFIG_FILE"
    echo "valid_months=$valid_months" >> "$CONFIG_FILE"
    
    echo -e "${GREEN}用户配置已更新！${NC}"
}

# 更新配置
update_config_display() {
    echo -e "${GREEN}配置更新成功！${NC}"
}

# 主菜单
main_menu() {
    echo "请选择要执行的操作："
    echo "1. 更新 Docker 守护进程"
    echo "2. 退出"
}

# 执行操作
execute_operation() {
    case $1 in
        1)
            echo "正在更新 Docker 守护进程..."
            bash -c "$(curl -fsSL https://gitee.com/banban1000/docker/raw/master/dsm/rewrite_daemen.sh)"
            exit 0
            ;;
        2)
            echo "退出。"
            exit 0
            ;;
        *)
            echo "无效选项，请重新输入"
            ;;
    esac
}

# 主程序流程
init_env
check_root
load_users

# 先尝试检查本地配置
if ! check_config; then
    # 本地配置检查失败，要求登录
    if ! user_login; then
        echo -e "${RED}登录失败，程序退出。${NC}"
        exit 1
    fi
fi

# 主循环
while true; do
    main_menu
    read -p "请输入选项编号: " choice
    execute_operation "$choice"
done